/*
 * CTRL_ProfesorSolicitaAyudantes.java
 *
 * Created on October 3, 2007, 1:58 PM
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAyudantes;

import com.sun.rave.web.ui.model.Option;
import entidad.Profesor;
import entidad.ayudantias.Ayudantiavaria;
import entidad.ayudantias.Solicitudayudantia;
import entidad.ayudantias.TipoAyudantia;
import entidad.ayudantias.TipoAyudantia.TipoAyudantiaEnum;
import hero.interfaces.BnNodePropertyValue;
import hero.interfaces.BnNodeValue;
import java.sql.SQLException;
import java.sql.Date;

import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.Ayudantias.SolicitarAyudantes.ProfesorSolicitaAyudantes;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.*;

/**
 *
 * @author kabad
 */
public class CTRL_ProfesorSolicitaAyudantes extends CTRL_Base {

    private final String nombreProceso = Logica.modelo_SolicitarAyudantes;
    private ProfesorSolicitaAyudantes gui;
    private int idSolicitudAyudantia;
    private final String nombreActividad = "Profesor Solicita Ayudantes";
    private boolean iteracion = false;

    /**
     * Creates a new instance of CTRL_ProfesorSolicitaAyudantes
     */
    public CTRL_ProfesorSolicitaAyudantes(ProfesorSolicitaAyudantes gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
    }

    public void inicializar() throws MensajeException {
        /***********************************************************
         *Lee y mantiene el nombre de la instancia de proceso
         ***********************************************************/
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
        hLisIteracion();

        /************************************************************
         *Verificar si viene de una iteraccion si es asi hay que precargar la informacion
         ***********************************************************/
        if (isIteracion()) {
            precargarDatosSiEsPosible();
        } else {
            Option[] listaOpciones = new Option[2];
            Option tempOption;

            tempOption = new Option();
            tempOption.setLabel("Académicas");
            tempOption.setValue(TipoAyudantiaEnum.ACADEMICA);
            listaOpciones[0] = tempOption;

            tempOption = new Option();
            tempOption.setLabel("Actividades Varias");
            tempOption.setValue(TipoAyudantiaEnum.ACTIVIDADES_VARIAS);

            listaOpciones[1] = tempOption;


            gui.getDropDown1DefaultOptions().setOptions(listaOpciones);
            gui.getDropDown1().setSelected(TipoAyudantiaEnum.ACTIVIDADES_VARIAS);
        }
        gui.getPanelNavegacion().getLblNavegacion().setText(nombreProceso + " -> " + nombreActividad);
    }

    private void hLisIteracion() {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                setIteracion(false);
                return;
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);

            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            if (actividad.getStartDate() != null) {
                setIteracion(true);
            } else {
                setIteracion(false);
            }
        } catch (Exception ex) {
            setIteracion(false);
        }
    }

    public void guardarActividadProfesorSolicitaAyudantes() throws MensajeException {
        String nombreInstanciaProceso;
        BnNodeValue actividad;
        Solicitudayudantia solicitudExistente;
        int idSolicitudAyudantia;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso != null) {
                prjSession.initProject(nombreInstanciaProceso);
            }
            Solicitudayudantia solicitudayudantia = new Solicitudayudantia();
            if (isIteracion() && (nombreInstanciaProceso != null)) {
                idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());
                solicitudayudantia = logica.getLogAyudantia().leerSolicitudayudantia(idSolicitudAyudantia);
                solicitudayudantia = llenarDatosActividadProfesorSolicitaAyudantes(solicitudayudantia);
                solicitudayudantia = logica.getLogAyudantia().guardarYClonarSolicitudAyudantia(solicitudayudantia);
            }
            if ((nombreInstanciaProceso == null) && (!isIteracion()) ) {
                TipoAyudantiaEnum tipoAyud = gui.getTipoAyudantiaSeleccionada();
                int idAyud = Integer.parseInt((String) gui.getDdlNombreAyudantia().getSelected());
                solicitudExistente = logica.getLogAyudantia().existeSolicitudayudantiaPorIdAyudantia(tipoAyud == TipoAyudantiaEnum.ACTIVIDADES_VARIAS ? idAyud : 0, tipoAyud == TipoAyudantiaEnum.ACADEMICA ? idAyud : 0);
                if (solicitudExistente != null) {
                    throw new MensajeException("Ya existe una solicitud activa para esta ayudantía ");
                }
                solicitudayudantia = llenarDatosActividadProfesorSolicitaAyudantes(null);
                nombreInstanciaProceso = prjSession.instantiateProject(nombreProceso, Logica.version_SolicitarAyudantes);
                solicitudayudantia.setNombreinstanciaproceso(nombreInstanciaProceso);
                solicitudayudantia = logica.getLogAyudantia().nuevoSolicitudayudantia(solicitudayudantia);
                prjSession.setProperty("idSolicitudProceso", solicitudayudantia.getIdSolicitudAyudantia() + "");
                solicitudayudantia = logica.getLogAyudantia().clonarSolicitudAyudantia(solicitudayudantia);
            }
            nombreInstanciaProceso = prjSession.getName();
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);

            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            prjSession.setNodeProperty(nombreActividad, "idSolicitudActividad", solicitudayudantia.getIdSolicitudAyudantia() + "");
            prjSession.setProperty("fechaMaxRegistro", solicitudayudantia.getFechaMaxRegistro().getTime() + "");
            usrSession.startActivity(nombreInstanciaProceso, nombreActividad);
            usrSession.terminateActivity(nombreInstanciaProceso, nombreActividad);
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_ProfesorSolicitaAyudantes.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException("No es posible guardar la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    public void cambioTipoAyudantia() {
        Option[] listaOpciones;
        Option tempOption;
        Vector<Ayudantiavaria> listaAyudantias;
        Ayudantiavaria elemAyudantia;
        TipoAyudantiaEnum tipoAyudantia = gui.getTipoAyudantiaSeleccionada();
        try {
            listaAyudantias = logica.leerAyudantias(tipoAyudantia);
            listaOpciones = new Option[listaAyudantias.size()];
            for (int i = 0; i < listaAyudantias.size(); i++) {
                elemAyudantia = listaAyudantias.get(i);
                tempOption = new Option();
                tempOption.setLabel(elemAyudantia.getNombre());
                tempOption.setValue(elemAyudantia.getIdAyudantiaVaria() + "");
                listaOpciones[i] = tempOption;
            }
            gui.getDdlNombreAyudantiaDefaultOptions().setOptions(listaOpciones);
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public boolean isIteracion() {
        return iteracion;
    }

    private Solicitudayudantia llenarDatosActividadProfesorSolicitaAyudantes(Solicitudayudantia solicitud) throws MensajeException {
        Solicitudayudantia solicitudayudantiatemp;
        try {
            validarDatosIngresados();
            if (solicitud == null) {
                solicitudayudantiatemp = new Solicitudayudantia();
            } else {
                solicitudayudantiatemp = solicitud;
            }
            java.util.Date fecha = new java.util.Date();
            if (!isIteracion()) {
                //datos que solo se deben guradar cuando la solicitud pasa por esta actividad la primera vez.
                TipoAyudantiaEnum tipoAyudantia = (TipoAyudantiaEnum) gui.getDropDown1().getSelected();
                int idAyudantia = Integer.parseInt((String) gui.getDdlNombreAyudantia().getSelected());
                solicitudayudantiatemp.setFkIdAyudantiaVaria(tipoAyudantia == tipoAyudantia.ACTIVIDADES_VARIAS ? idAyudantia : 0);
                solicitudayudantiatemp.setFkIdMateria(tipoAyudantia == tipoAyudantia.ACADEMICA ? idAyudantia : 0);
                solicitudayudantiatemp.setEstado("Activa");
                solicitudayudantiatemp.setFechacreacion(new Date(fecha.getTime()));
            }
            solicitudayudantiatemp.setFechamodificacion(new Date(fecha.getTime()));

            java.util.Date fechaMaxRegistro = (java.util.Date) gui.getCalMaxRecepcionSolicitudes().getText();
            solicitudayudantiatemp.setFechaMaxRegistro(new Date(fechaMaxRegistro.getTime()));
            fechaMaxRegistro = gui.getCalFechaInicio().getSelectedDate();
            solicitudayudantiatemp.setFechainicioayudantia(new Date(fechaMaxRegistro.getTime()));
            fechaMaxRegistro = gui.getCalFechaFin().getSelectedDate();
            solicitudayudantiatemp.setFechafinayudantia(new Date(fechaMaxRegistro.getTime()));

            Profesor profesor = logica.leerProfesorPorUsuario(usuario.getUsuario());
            solicitudayudantiatemp.setFkIdProfesor(profesor.getIdProfesor());
            solicitudayudantiatemp.setHorasAyudantias((Integer) gui.getTxtNumHoras().getText());
            solicitudayudantiatemp.setActividadarealizar((String) gui.getTxtActividadRealizar().getText());
            solicitudayudantiatemp.setRequisitosAdicionales((String) gui.getTxtaRequerimientos().getText());
            if (gui.getChbAdjuntarHojaVida().getValue() == null) {
                gui.getChbAdjuntarHojaVida().setValue(false);
            }
            solicitudayudantiatemp.setRequiereAdjunto((Boolean) gui.getChbAdjuntarHojaVida().getValue());
            solicitudayudantiatemp.setMensajeParaDecano((String) gui.getTxtaComentarios().getText());
            return solicitudayudantiatemp;
        } catch (SQLException ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_ProfesorSolicitaAyudantes.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException("No es posible guardar los datos de la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    private void precargarDatosSiEsPosible() throws MensajeException {
        BnNodeValue actividad;
        String nombreInstanciaProceso;
        TipoAyudantia tipoAyudantia;
        Solicitudayudantia solicitudayudantia;
        try {
            if (!(usrSession != null && prjSession != null)) {
                throw new Exception();
            }
            nombreInstanciaProceso = getNombreInstanciaProceso();
            if (nombreInstanciaProceso == null) {
                return;
            }
            prjSession.initProject(nombreInstanciaProceso);
            actividad = usrSession.getNode(nombreInstanciaProceso, nombreActividad);

            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }

            if (actividad.getStartDate() != null) {

                idSolicitudAyudantia = Integer.parseInt(prjSession.getProperty("idSolicitudProceso").getTheValue());

                solicitudayudantia = logica.getLogAyudantia().leerSolicitudayudantiaNivel2(idSolicitudAyudantia);
                tipoAyudantia = logica.leerTipoAyudantia(solicitudayudantia);
                gui.getLblTipoAyudantia().setText(tipoAyudantia.getNombre());

//                cambioTipoAyudantia();//carga las ayudantias dependiendo del tipo
                if (tipoAyudantia.getTipo() == TipoAyudantiaEnum.ACADEMICA) {// Ayudantias academicas

                    gui.getLblNombreAyudantia().setText(solicitudayudantia.getMateria().getNombre());
                } else {
                    gui.getLblNombreAyudantia().setText(solicitudayudantia.getAyudantiavaria().getNombre());
                }

                gui.getTxtNumHoras().setText(solicitudayudantia.getHorasAyudantias());
                gui.getTxtaRequerimientos().setText(solicitudayudantia.getRequisitosAdicionales());
                gui.getChbAdjuntarHojaVida().setValue(solicitudayudantia.getRequiereAdjunto());
                gui.getCalMaxRecepcionSolicitudes().setSelectedDate(solicitudayudantia.getFechaMaxRegistro());
                gui.getCalFechaInicio().setSelectedDate(solicitudayudantia.getFechainicioayudantia());
                gui.getCalFechaFin().setSelectedDate(solicitudayudantia.getFechafinayudantia());
                gui.getTxtActividadRealizar().setText(solicitudayudantia.getActividadarealizar());
                gui.getTxtaComentarios().setText(solicitudayudantia.getMensajeParaDecano());

            }

        } catch (Exception ex) {
            ex.printStackTrace();
            Logger.getLogger(CTRL_ProfesorSolicitaAyudantes.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException("No es posible iniciar la solicitud. Por favor, intente luego de unos minutos.");
        }
    }

    private boolean validarDatosIngresados() throws MensajeException {
        java.util.Date fechaIngresada;
        java.util.Date fechaActual = new java.util.Date();

        fechaIngresada = (java.util.Date) gui.getCalMaxRecepcionSolicitudes().getText();
        if (fechaIngresada.compareTo(fechaActual) <= 0) {
            throw new MensajeException("La fecha ingresada debe ser mayor a la fecha actual");
        }
        return true;
    }

    public void setIteracion(boolean iteracion) {
        this.iteracion = iteracion;
        if (iteracion) {
            gui.getDdlNombreAyudantia().setVisible(false);
            gui.getDropDown1().setVisible(false);
            gui.getLblTipoAyudantia().setVisible(true);
            gui.getLblNombreAyudantia().setVisible(true);
        } else {
            gui.getDropDown1().setVisible(true);
            gui.getDdlNombreAyudantia().setVisible(true);
            gui.getLblTipoAyudantia().setVisible(false);
            gui.getLblNombreAyudantia().setVisible(false);
        }

    }
}
